import Service from '../../../../libs/service_0_0_6.js'
import ListRequestAndResponseData from '../../../../libs/dto/ListRequestAndResponseData.js'
import RequestAndResponseData from '../../../../libs/dto/RequestAndResponseData.js';
import MessageSenderUtils from '../../../../libs/message_sender_utils_0_0_3.js'
import DtoMessage from '../../../../libs/dto/DtoMessage.js'

let listRequestAndResponse = new ListRequestAndResponseData()

/**
* Добавление действия на кнопку очистки списка со статистикой.
*/
document.addEventListener('DOMContentLoaded', function () {
    let buttonClearStatistics = document.querySelector('#button_clear_statistics')
    buttonClearStatistics.addEventListener('click', function (event) {
        let tableData = document.querySelector('.table_data')
        tableData.innerHTML = ''
        listRequestAndResponse.clearList()
    })
});

/**
* Блок обработки запросов и ответов. В данном примере игнорируется получение тела ответа, т.к, это затратная процедура
* и тело ответа нигде не используется. Для работы данного блока необходимо открыть инструменты разработчика и перейти на
* вкладку: 'Request Monitoring'.
* Модель данных параметра 'api' описана в файле ApiModelData.json
*/
chrome.devtools.network.onRequestFinished.addListener(async api => {
        let responseBody = await getContent(api)

        // Получение данных по запросу и ответу
        let requestAndResponseData = await RequestAndResponseData.BuildFromObj(api, responseBody)

        listRequestAndResponse.addEntry(requestAndResponseData)

        let isSendStatisticsToOptionsModule = document.querySelector('#is_send_statistics_to_options_module')
        if (isSendStatisticsToOptionsModule.checked) {
            function sendMessageToComponent(text, recipient) {
                let message = new Object();
                message.data = text
                message.sender = utils.getCurrentName()
                message.recipient = recipient
                utils.log('Отправка сообщения по адресу: ' + message.recipient)
                utils.logOutMessage(message)
                chrome.runtime.sendMessage(JSON.stringify(message),
                    function (response) {
                        if (chrome.runtime.lastError) {
                            utils.log('Ошибка получения ответа');
                            utils.log("От панели DevTools не получено ответа, требуется открыть вкладку 'Panel' инструменты разработчика")
                        } else {
                            utils.logInMessage(JSON.parse(response))
                        }
                    });
            }
            let msg = DtoMessage.BuildFromParams(requestAndResponseData.getRequest().getUrl())
            sendMessageToComponent(msg.getStringifyObject(), 'options')
        }

        let tableData = document.querySelector('.table_data');
        let titleBlock = listRequestAndResponse.getStatisticsAll()
        let keysTitleBlock = Object.keys(titleBlock)
        tableData.innerHTML = ''
        // Цикл перебора блоков со значениями
        for (let i = 0; i < keysTitleBlock.length; i++) {
            let title = keysTitleBlock[i]

            let entry = titleBlock[keysTitleBlock[i]]
            let keysEntry = Object.keys(entry)

            let paramsColspan = new Object()
            paramsColspan['name'] = 'colspan'
            paramsColspan['value'] = 2
            let paramsStyle = new Object()
            paramsStyle['name'] = 'style'
            paramsStyle['value'] = 'background-color: #FFFFFF'

            let arrParams = new Array()
            arrParams.push(paramsColspan)
            arrParams.push(paramsStyle)
            let tdTitle = Service.createCustomElement('td', `${title}`, arrParams);

            // Создание строки с заголовком блока (Method, Status и т.д.)
            let trTitle = Service.createCustomElement('tr', ``, []);
            trTitle.append(tdTitle)
            tableData.append(trTitle)

            // Цикл перебора элементов списка
            for (let k = 0; k < keysEntry.length; k++) {
                let value = keysEntry[k]
                let count = entry[keysEntry[k]]
                // Создание строки с указанием типа и количества повторений (GET=3, POST=8 и т.д.)
                let trLine = Service.createCustomElement('tr', ``, []);
                var tdElemValue = Service.createCustomElement('td', `${value}`, []);
                trLine.append(tdElemValue)
                var tdElemCount = Service.createCustomElement('td', `${count}`, []);
                trLine.append(tdElemCount)
                tableData.append(trLine)
            }
        }
    }
);

/**
* Асинхронный вызов метода получения содержимого тела ответа. В другой реализации помимо данных тела ответа можно
* так же получить кодировку.
*/
let getContent = async response => {
    return new Promise(resolve => {
      response.getContent((body) => {
        resolve(body)
      })
    })
}

let utils = new MessageSenderUtils('devtools')